实用的Git高级用法 (一)

本文大部分内容翻译自一篇Git好文(原文地址),经过我拙劣的英文加上自定义的删减与修改~ 也作为Git系列的开头篇

Interactive stage

你也许经常会遇到在对一个文件的多次不同的修改,并且在提交的时候常犹豫哪一段修改是需要commit,这时你可以使用:

git add/commit -p <FILE>

加上 -p 参数之后,git会一块一块的显示出差异,确认当前块是否需要暂存。这样你可以提交文件中的部分修改,还可以使用 -i 参数,更为详细的交互式界面。

ps: 使用交互式的提交不仅能让Commit更加的准确,还可以对代码进行一次很好的review,是值得养成的一个好习惯

Checkout Your Last Branch

当你正忙碌的工作在当前分支下,此时有紧急需求需要对之前的主分支做一些修改,
这时候常用的操作流:

git stash
git checkout develop
//修改提交后 ...commit..push..
git checkout xxx
git stash pop

你可能觉得这样很繁琐乏味,你需要这样的操作:

git checkout -
//切换到develop分支 ...commit...push
git checkout -

这样可以快速切换分支,只能切换到当前分支的上一级母分支,和*NIX的 cd - 类似。

Show Which Branches are Merged (or not)

工作中经常同时工作于多个分支之上,一个项目的feature分支会非常的多,可以通过 branch --list/-l 看到,常遇到情况是,当想清理分支的时候心理还带着一丝犹豫,担心这个分支是否合并到主分支过,或者经常忘记哪些分支合并过,哪些没有。一般情况下都去查看pr记录,或者检查commit信息。
那你可能需要是以下的操作:

git branch --no-merged

可以查看有哪些分支还没有合并到当前的分支, 当然也可以查看哪些已经合并过:

git branch --merged

并且还可以配合一些简单的UNIX工具来执行迅速的删除操作,像这样:

git branch --merged | xargs git branch -d

Grab a File from Another Branch without Switching Branches

当你在做一些类似重构的工作时,你可能需要从多个分支中取出不同的几个修改纳入到当前的分支来。
如果没有下面的提示,你可能进行的操作是:

while(true){
  stash 当前修改
  切换分支
  找出修改的部分,copy到临时文件
  checkout -
  粘贴到该修改的地方
}

或者你可以进行简单的文件迁移工作:

git checkout <BRANCH> -- path/to/file.rb
eg: 
#把tmp分支的 .gitignore 修改迁移到本分支
git checkout tmp -- ./.gitignore

注意,这里是整个文件的覆盖,并不是合并。

Git Branches Sorted by Last Commit

你应该已经看到了本地的一大堆杂乱的分支,并且使用之前的 --merged 清理过其中一些分支了,那对于剩下的分支,该如何确定哪些是有用的,哪些是过时的呢?

for-each-ref 命令会输出每个分支列表,并且显示最后一次的提交信息。重要的是,我们还可以对列表进行日期的排序,以下命令会显示整个分支列表以及最后一次提交信息和提交者,并且按日期降序排序。

//这是原版
git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname:short) [%(committername)]'
//原版并没有输出commit时的message,以下是我个人使用的改良版
git for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname:short) "%(subject)" [%(committername)]'

建议给它取一个别名,方便日后使用。

git config --global alias.latest "for-each-ref --sort=-committerdate --format='%(committerdate:short) %(refname:short) "%(subject)" [%(committername)]'"